package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * 处理用户头像上传的Servlet
 * 使用@WebServlet注解映射到"/ProfileServlet"路径
 * 使用@MultipartConfig注解配置文件上传参数
 */
@WebServlet("/ProfileServlet")
@MultipartConfig(fileSizeThreshold = 1024 * 1024, // 文件写入磁盘的阈值，1MB
        maxFileSize = 1024 * 1024 * 10, // 单个文件最大大小，10MB
        maxRequestSize = 1024 * 1024 * 15 // 请求最大大小，15MB
)
public class ProfileServlet extends HttpServlet {

    /**
     * 处理POST请求的方法
     * 负责接收和保存用户上传的头像文件
     * 
     * @param request  HTTP请求对象，包含上传的文件
     * @param response HTTP响应对象，用于返回处理结果
     * @throws ServletException 如果处理请求时发生错误
     * @throws IOException      如果发生I/O错误
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置请求编码为UTF-8，确保中文正确显示
        request.setCharacterEncoding("UTF-8");

        // 获取上传的文件部分
        Part filePart = request.getPart("profileImage");
        // 获取原始文件名
        String fileName = getSubmittedFileName(filePart);

        if (fileName != null && !fileName.isEmpty()) {
            // 获取上传目录的真实路径
            String uploadPath = getServletContext().getRealPath("/uploads");
            File uploadDir = new File(uploadPath);

            // 如果上传目录不存在，则创建
            if (!uploadDir.exists()) {
                uploadDir.mkdir();
            }

            // 生成唯一文件名，使用时间戳避免文件名冲突
            String uniqueFileName = System.currentTimeMillis() + "_" + fileName;
            String filePath = uploadPath + File.separator + uniqueFileName;

            // 将文件保存到服务器
            filePart.write(filePath);

            // 将文件路径保存到session中，供其他页面使用
            HttpSession session = request.getSession();
            session.setAttribute("profileImage", "uploads/" + uniqueFileName);

            // 设置成功消息
            request.setAttribute("message", "图片上传成功！");
        } else {
            // 如果没有选择文件，设置错误消息
            request.setAttribute("error", "请选择要上传的图片！");
        }

        // 转发回个人资料页面
        request.getRequestDispatcher("profile.jsp").forward(request, response);
    }

    /**
     * 从Part对象中获取上传文件的原始文件名
     * 
     * @param part 包含文件上传信息的Part对象
     * @return 原始文件名，如果获取失败则返回空字符串
     */
    private String getSubmittedFileName(Part part) {
        // 获取Content-Disposition头信息
        String contentDisp = part.getHeader("content-disposition");
        String[] items = contentDisp.split(";");

        // 遍历头信息项，查找filename
        for (String item : items) {
            if (item.trim().startsWith("filename")) {
                // 提取文件名，去除引号
                return item.substring(item.indexOf("=") + 2, item.length() - 1);
            }
        }
        return "";
    }

    /**
     * 处理GET请求的方法
     * 将GET请求转发给doPost方法处理
     * 
     * @param request  HTTP请求对象
     * @param response HTTP响应对象
     * @throws ServletException 如果处理请求时发生错误
     * @throws IOException      如果发生I/O错误
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
}